<?php
/***
 * ActionLeaf (www.actionleaf.com / actionleaf.googlecode.com) PHP Framework
 * Copyright (c) 2008, Wess D. Cope <wess@wattz.net>
 * All rights reserved.								
 * 													
 * Redistribution and use in source and binary forms, with or without modification,
 * are permitted provided that the following conditions are met:                   
 * 																				
 * 	* Redistributions of source code must retain the above copyright notice,	
 * 	this list of conditions and the following disclaimer.						
 * 																				
 * 	* Redistributions in binary form must reproduce the above copyright notice, 
 * 	this list of conditions and the following disclaimer in the documentation   
 * 	and/or other materials provided with the distribution. 						
 * 																				
 * 	* Neither the name of the <ORGANIZATION> nor the names of its contributors may
 * 	be used to endorse or promote products derived from this software without     
 * 	specific prior written permission.											
 * 																				
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY 	 
 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES  
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT 	 
 * SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 		 
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED  
 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR 	 
 * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 	 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN 	 
 * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH 	 
 * DAMAGE.																				 
 **/

include_once(ALResultObject);
include_once(ALDataObject);

/**
 * Foundation.ALData
 * Setup and handle all data registries and pooling... <incomplete/>
 */

class ALData
{
	protected $connectionName;
	protected $currentConnection;
	protected $errorDetails;
	
	public function __construct($connectionName = NO)
	{

		if(!$connectionName)
			die("No Connection name given");
			
		$this->connectionName = $connectionName;

		$this->currentConnection = ALDbConnection::getConnection($connectionName);

	}

	/**
	 * Execute a sql query
	 *
	 * @param	string
	 *
	 * @return	mixed		Returns array of objects (1 per row) or bool false on error.
	 **/
	public function query($qry)
	{

		try {
			if(!$result = $this->currentConnection->query($qry)) {
				$errorInfo = $this->currentConnection->errorInfo();
				die($qry . "<br><br> Query Error: " . $errorInfo[2]);
			}
			$resultSet = $result->fetchAll(PDO::FETCH_OBJ);
		} catch (PDOException $e) {
			die($qry . "<br><br> Error: " . $e->message);
		}

		return count($resultSet)?$resultSet:NO;

	}
	
	/**
	 * Execute a sql statement.
	 *
	 * @param	string		SQL Statment
	 *
	 * return	mixed		Returns number of rows effected or deleted on success or (bool)false
	 * 						on failure.
	 **/
	public function exec($qry)
	{

		$this->errorDetails = null;

		try {
			if(!$this->currentConnection->exec($qry)) {

				$this->errorDetails['errorCode'] = $this->currentConnection->errorCode();
				$this->errorDetails['errorMsg'] = $this->currentConnection->errorInfo();
				return false;

			}
		} catch (PDOException $e) {

			$this->errorDetails['errorCode'] = $e->getCode();
			$this->errorDetails['errorMsg'] = $e->getMessage();
			return false;

		}

		return true;

	}

	/**
	 * Return Error Details
	 *
	 * @return	mixed		null or array of error details.  [errorCode,errorMsg]
	 **/
	public function getErrorDetails()
	{

		return $this->errorDetails;

	}

	/**
	 *	Return array of objects per row.  Each object has a property for each column in the table.
	 *
	 * @param	string
	 *
	 * @return	mixed		Returns array of objects (1 per row) or bool false on error.
	 **/
	public function getAll($table)
	{

		return $this->currentConnection->query("SELECT * FROM {$table}");

	}
	
	/**
	 * Pass method calls to PDO
	 *
	 * @param	PDO method name
	 * @param	Arguments array
	 **/
	public function __call($methodName, $args)
	{

		call_user_func_array(array($this->currentConnection,$methodName), $args);

	}

}